home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 21 / AACD 21.iso / AACD / System / XFDmaster / xfd_Developer / Sources / ASM / DataPACK.a < prev    next >
Encoding:
Text File  |  2001-03-25  |  5.0 KB  |  225 lines

  1. * Programmheader
  2. *
  3. *    Name:        DataPACK
  4. *    Author:        SDI
  5. *    Distribution:    PD
  6. *    Description:    XFD external decruncher for unknown PACK data
  7. *    Compileropts:    -
  8. *    Linkeropts:    -
  9. *
  10. * 1.0   07.02.98 : first version
  11. * 1.1   08.02.98 : recognized Testament PACK as PP20 Clone, added PP2O and
  12. *    "Seek and Destroy" PP-Clones
  13. * 1.2   09.02.98 : little fixes
  14. * 1.3   28.02.98 : better Pepsi-Recognition
  15. * 1.4   03.03.98 : removed PP2O
  16. * 1.5   11.11.98 : removed PP20-Clone
  17.  
  18.         INCLUDE    "AINCLUDE:IncDirs.i"
  19.         INCLUDE    "lvo.i"
  20.  
  21.         INCLUDE    "libraries/xfdmaster.i"
  22.         INCLUDE    "exec/memory.i"
  23.  
  24.         * head function for tests
  25. *        INCLUDE    "xfdExeHead.a"
  26.  
  27. ForeMan        MOVEQ    #-1,D0        ;security
  28.         RTS
  29.  
  30.         DC.L    XFDF_ID
  31.         DC.W    1,0
  32.         DC.L    0,0,Slave1
  33.  
  34.         DC.B    "$VER: DataPACK 1.5 (11.11.1998) by SDI",0
  35. N_PACKPepsi    DC.B    'PACK Data (Pepsi Game)',0
  36.         EVEN
  37.  
  38. *** This is a ByteKiller clone!
  39.  
  40. Slave1        DC.L    0        ;next slave
  41.         DC.W    2        ;version
  42.         DC.W    38        ;master version
  43.         DC.L    N_PACKPepsi    ;name
  44.         DC.W    XFDPFF_DATA|XFDPFF_USERTARGET|XFDPFF_RECOGLEN
  45.         DC.W    0
  46.         DC.L    RB_PACKPepsi    ;recog buffer
  47.         DC.L    DB_PACKPepsi    ;decrunch buffer
  48.         DC.L    0        ;recog segment
  49.         DC.L    0        ;decrunch segment
  50.         DC.W    0,0
  51.         DC.L    $10        ;MinBufSize
  52.  
  53. *************************************************************************
  54. *    Recog buffer function: receives buffer + length in A0/D0    *
  55. *    and receives pointer to struct RecogResult in A1        *
  56. *************************************************************************
  57.  
  58. PEP_SOURCELEN    EQU    4
  59. PEP_DESTLEN    EQU    8
  60. PEP_PACKMATCH    EQU    $025569EE
  61.  
  62. RB_PACKPepsi    MOVEQ    #0,D0            ; False
  63.  
  64.         CMPI.L    #"PACK",(A0)
  65.         BNE.B    .No
  66.  
  67.         MOVE.L    PEP_SOURCELEN(A0),D1
  68.         SUBI.L    #PEP_PACKMATCH,D1 ; must be greater than PACKMATCH
  69.         BLE.B    .No
  70.         CMP.L    #$C800000,D1      ; should be shorther than 200MB
  71.         BGT.B    .No
  72.         MOVE.L    PEP_DESTLEN(A0),D1
  73.         CMP.L    PEP_SOURCELEN(A0),D1 ; source <= destination
  74.         BLE.B    .No
  75.         SUBI.L    #PEP_PACKMATCH,D1 ; must be greater than PACKMATCH
  76.         BLE.B    .No
  77.         CMP.L    #$C800000,D1      ; should be shorther than 200MB
  78.         BGT.B    .No
  79.  
  80.         MOVE.L    D1,xfdrr_FinalTargetLen(A1)
  81.         MOVE.L    D1,xfdrr_MinTargetLen(A1)
  82.         MOVEQ    #1,D0            ; True
  83. .No        RTS
  84.  
  85. *************************************************************************
  86. *    Decrunch buffer functions: receives xfdbiBufferInfo in A0    *
  87. *************************************************************************
  88.  
  89. DB_PACKPepsi    MOVEM.L    D2-D5/A2/A4-A6,-(A7)
  90.         MOVE.L    4.W,A6
  91.         MOVE.L    A0,A5
  92.         MOVE.L    xfdbi_SourceBuffer(A5),A4
  93.  
  94.         MOVE.W    #XFDERR_NOMEMORY,xfdbi_Error(A5)
  95.         MOVE.L    PEP_DESTLEN(A4),D0
  96.         SUBI.L    #PEP_PACKMATCH,D0
  97.         MOVE.L    xfdbi_UserTargetBuf(A5),A1
  98.         MOVE.L    D0,xfdbi_TargetBufSaveLen(A5)
  99.  
  100.         BTST.B    #XFDFB_USERTARGET,1+xfdbi_Flags(A5)
  101.         BNE.B    .Decrunch
  102.  
  103.         MOVE.L    D0,xfdbi_TargetBufLen(A5)
  104.         MOVE.L    xfdbi_TargetBufMemType(A5),D1
  105.         JSR    _LVOAllocMem(A6)
  106.         MOVE.L    D0,xfdbi_TargetBuffer(A5)
  107.         BEQ.B    .End
  108.  
  109.         MOVE.L    D0,A1
  110. .Decrunch    MOVE.L    A4,A0
  111.         LEA.L    $10(A0),A0    * pack space start
  112.         MOVE.L    xfdbi_TargetBufSaveLen(A5),D1
  113.         MOVE.L    PEP_SOURCELEN(A4),D0
  114.         SUBI.L    #PEP_PACKMATCH,D0
  115.         MOVE.W    #XFDERR_CORRUPTEDDATA,xfdbi_Error(A5)
  116.  
  117.         BSR.B    DecompPepsi
  118.  
  119.         BTST.B    #XFDFB_USERTARGET,1+xfdbi_Flags(A5)
  120.         BNE.B    .End
  121.         TST.L    D0
  122.         BNE.B    .ok
  123.         MOVE.L    xfdbi_TargetBuffer(A5),A1
  124.         MOVE.L    xfdbi_TargetBufLen(A5),D0
  125.         JSR    _LVOFreeMem(A6)
  126.         MOVEQ    #0,D0
  127.         BRA.B    .End
  128. .ok        CLR.W    xfdbi_Error(A5)
  129.         MOVEQ    #1,D0
  130. .End        MOVEM.L    (A7)+,D2-D5/A2/A4-A6
  131.         RTS
  132.  
  133. *************************************************************************
  134. *          decrunch routine for Pepsi PACK data            *
  135. *                                    *
  136. *    gets following parameters:                    *
  137. *        D0    crunched size                    *
  138. *        D1    uncrunched size                    *
  139. *        A0    source buffer                    *
  140. *        A1    destination buffer                *
  141. *    returns D0: 0 = error                        *
  142. *************************************************************************
  143.  
  144. DecompPepsi    MOVEA.L    A1,A2
  145.         MOVE.L    -4(A0),D5    * checksum
  146.         ADDA.L    D0,A0    * get end of source buffer
  147.         ADDA.L    D1,A2    * get end of destination buffer
  148.         MOVE.L    -(A0),D0
  149.         EOR.L    D0,D5
  150. .Decr1        LSR.L    #1,D0
  151.         BNE.B    .Decr2
  152.         BSR.B    .DecrSub1
  153. .Decr2        BCS.B    .Decr9
  154.         MOVEQ    #8,D1
  155.         MOVEQ    #1,D3
  156.         LSR.L    #1,D0
  157.         BNE.B    .Decr3
  158.         BSR.B    .DecrSub1
  159. .Decr3        BCS.B    .Decr11
  160.         MOVEQ    #3,D1
  161.         CLR.W    D4
  162. .Decr4        BSR.B    .DecrSub2
  163.         MOVE.W    D2,D3
  164.         ADD.W    D4,D3
  165. .Decr5        MOVEQ    #7,D1
  166. .Decr6        LSR.L    #1,D0
  167.         BNE.B    .Decr7
  168.         BSR.B    .DecrSub1
  169. .Decr7        ROXL.L    #1,D2
  170.         DBRA    D1,.Decr6
  171.         MOVE.B    D2,-(A2)
  172.         DBRA    D3,.Decr5
  173.         BRA.B    .Decr13
  174.  
  175. .Decr8        MOVEQ    #8,D1
  176.         MOVEQ    #8,D4
  177.         BRA.B    .Decr4
  178.  
  179. .Decr9        MOVEQ    #2,D1
  180.         BSR.B    .DecrSub2
  181.         CMPI.B    #2,D2
  182.         BLT.B    .Decr10
  183.         CMPI.B    #3,D2
  184.         BEQ.B    .Decr8
  185.         MOVEQ    #8,D1
  186.         BSR.B    .DecrSub2
  187.         MOVE.W    D2,D3
  188.         MOVE.W    #$C,D1
  189.         BRA.B    .Decr11
  190.  
  191. .Decr10        MOVE.W    #9,D1
  192.         ADD.W    D2,D1
  193.         ADDQ.W    #2,D2
  194.         MOVE.W    D2,D3
  195. .Decr11        BSR.B    .DecrSub2
  196. .Decr12        SUBQ.W    #1,A2
  197.         MOVE.B    (A2,D2.W),(A2)
  198.         DBRA    D3,.Decr12
  199. .Decr13        CMPA.L    A2,A1
  200.         BLT.B    .Decr1
  201.         MOVEQ    #0,D0    * error
  202.         TST.L    D5        * checksum ok ?
  203.         BNE.B    .End
  204.         MOVEQ    #1,D0    * no error
  205. .End        RTS    
  206.  
  207. .DecrSub1    MOVE.L    -(A0),D0
  208.         EOR.L    D0,D5        * checksum
  209.         MOVE    #$10,CCR
  210.         ROXR.L    #1,D0
  211.         RTS    
  212.  
  213. .DecrSub2    SUBQ.W    #1,D1
  214.         CLR.W    D2
  215. .DecrSub2_1    LSR.L    #1,D0
  216.         BNE.B    .DecrSub2_2
  217.         MOVE.L    -(A0),D0
  218.         EOR.L    D0,D5        * checksum
  219.         MOVE    #$10,CCR
  220.         ROXR.L    #1,D0
  221. .DecrSub2_2    ROXL.L    #1,D2
  222.         DBRA    D1,.DecrSub2_1
  223.         RTS    
  224.         END
  225.